# -*- encoding: utf-8 -*-
"""
@File    : factory_method.py
@Author  : lilong
@Time    : 2021/12/17 9:41 上午
"""

"""
工厂类：抽象工厂类+工厂子类
工厂子类主要是为了生产对应的产品对象

产品类：抽象产品类+产品子类

工厂方法模式优缺点：
优点：更符合开闭原则，增加一个产品类，则只需要实现其具体的产品类和具体的工厂类即可；符合单一职责原则，每个工厂只负责生产对应的产品。
缺点：增加一个产品，就需要实现对应的具体工厂类和具体产品类；每个产品需要有对应的具体工厂和具体产品类。

"""

from abc import ABC, abstractmethod


# ----产品类-----
class Phone(ABC):
    """手机产品抽象类"""

    @abstractmethod
    def make(self):
        pass


class Apple(Phone):
    """苹果手机产品类"""
    def make(self):
        print("make apple")


class XiaoMi(Phone):
    """小米手机产品类"""

    def make(self):
        print("make xiaomi")


# -----工厂类-----
class AbastractFactory(ABC):
    """抽象工厂类"""

    @abstractmethod
    def product_phone(self):
        pass


class AppleFactory(AbastractFactory):
    """苹果手机工厂类"""

    def product_phone(self):
        return Apple().make()


class XiaomiFactory(AbastractFactory):
    """小米手机工厂类"""

    def product_phone(self):
        return XiaoMi().make()


# -------客户端消费------
def client_product(factory: AbastractFactory):
    return factory


if __name__ == '__main__':
    xiaomi = client_product(XiaomiFactory())
    xiaomi.product_phone()
    apple = client_product(AppleFactory())
    apple.product_phone()
